package com.onlinewebgames.memory;

import java.util.LinkedList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MemoryGame extends Activity {
	private static final int	PROGRESION				= 5;
	private static final int	BOTON_VERDE				= 0;
	private static final int	BOTON_ROJO				= 1;
	private static final int	BOTON_AZUL				= 2;
	private static final int	BOTON_AMARILLO			= 3;
	private static final int	TEXT_VIEW_NIVEL			= 0;
	private static final int	TEXT_VIEW_PUNTIACION	= 1;
	private static final int	TEXT_VIEW_RONDA			= 2;

	private int					paso					= 0;
	private int					ronda					= 0;
	private int					puntuacionActual		= 0;
	private int					nivelDificultad			= 0;
	private int					nivelVelocidad			= 0;

	private List<Integer>		combinacion;
	private List<ImageView>		botones;
	private List<Integer>			animaciones;
	private List<TextView>		textViews;

	private void actualizarEstado () {
		Log.d(this.getClass().toString(), "actualizarEstado");
		this.paso++;
		if (this.paso == this.combinacion.size()) {
			this.generarCombinacion();
		}
		if ((this.ronda % PROGRESION) == 0) {
			this.nivelVelocidad++;
			if ((this.nivelVelocidad % PROGRESION) == 0) {
				this.nivelDificultad++;
			}
		}

		this.actualizarTextViews();

	}

	private void actualizarTextViews () {
		Log.d(this.getClass().toString(), "actualizarTextViews");
		this.textViews.get(TEXT_VIEW_NIVEL).setText(this.nivelDificultad + "");
		this.textViews.get(TEXT_VIEW_PUNTIACION).setText(
				this.puntuacionActual + "");
		this.textViews.get(TEXT_VIEW_RONDA).setText(this.ronda + "");

	}

	public void botonMemory (final View view) {
		Log.d(this.getClass().toString(), "botonMemory");
		final ImageView boton = (ImageView) view;
		final int id = boton.getId();
		final int valorPaso = this.combinacion.get(this.paso);
		int pulsacion = -1;

		switch (id) {
			case R.id.buttonVerde:
				pulsacion = BOTON_VERDE;
				break;
			case R.id.buttonRojo:
				pulsacion = BOTON_ROJO;
				break;
			case R.id.buttonAzul:
				pulsacion = BOTON_AZUL;
				break;
			case R.id.buttonAmarillo:
				pulsacion = BOTON_AMARILLO;
				break;
		}

		if (valorPaso == pulsacion) {
			this.puntuacionActual++;
		} else {
			this.puntuacionActual--;
		}

		this.actualizarEstado();
	}

	private void generarCombinacion () {
		Log.d(this.getClass().toString(), "generarCombinacion");
		this.paso = 0;
		this.ronda++;
		this.combinacion = new LinkedList<Integer>();
		final int pasos = this.nivelDificultad + 2;
		for (int i = 0; i < pasos; i++) {
			this.combinacion.add(new Integer((int) (Math.random() * 4)));
		}
		Toast.makeText(this, "Siguiente Ronda: " + this.ronda,
				Toast.LENGTH_SHORT).show();
		animar();
	}

	private void animar () {
		for (int pasoCombinacion : combinacion) {
			Util.animate(botones.get(pasoCombinacion), animaciones.get(pasoCombinacion));
		}
	}

	private void obtenerBotones () {
		this.botones = new LinkedList<ImageView>();
		this.botones.add((ImageView) this.findViewById(R.id.buttonVerde));
		this.botones.add((ImageView) this.findViewById(R.id.buttonRojo));
		this.botones.add((ImageView) this.findViewById(R.id.buttonAzul));
		this.botones.add((ImageView) this.findViewById(R.id.buttonAmarillo));

		this.animaciones = new LinkedList<Integer>();
		this.animaciones.add(R.drawable.animacionbotonverde);
		this.animaciones.add(R.drawable.animacionbotonrojo);
		this.animaciones.add(R.drawable.animacionbotonazul);
		this.animaciones.add(R.drawable.animacionbotonamarillo);
		
		this.textViews = new LinkedList<TextView>();
		this.textViews.add((TextView) this.findViewById(R.id.textViewNivel));
		this.textViews.add((TextView) this
				.findViewById(R.id.textViewPuntuacion));
		this.textViews.add((TextView) this.findViewById(R.id.textViewRonda));
	}

	/** Called when the activity is first created. */
	@Override
	public void onCreate (final Bundle savedInstanceState) {
		Log.d(this.getClass().toString(), "Iniciando aplicacion");
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.memory);

		this.obtenerBotones();
		this.generarCombinacion();
		this.actualizarEstado();

	}
}